//go:build windows

package winserv

import (
	"errors"
	"os"
	"os/exec"

	"gitee.com/haodreams/golib/logs"
	"gitee.com/haodreams/libs/routine"
	"github.com/kardianos/service"
)

// 定义服务结构体（需实现 service.Service 接口）
type program struct {
	run func()
}

// 服务启动时触发
func (m *program) Start(s service.Service) error {
	logs.Info("服务启动...")
	// 服务主逻辑（定时写入日志）
	if m.run == nil {
		err := errors.New("未配置主线程函数")
		logs.Error(err)
		return err
	}

	go m.run() // 在后台运行主逻辑
	return nil
}

// 服务停止时触发
func (m *program) Stop(s service.Service) error {
	routine.Stop()
	return nil
}

func Main(name, displayname, description string, f func()) {
	// 配置服务元数据
	config := &service.Config{
		Name:        name,   // 服务名称（唯一）
		DisplayName: displayname,  // 显示名称（用户可见）
		Description: description, // 描述
		// WorkingDirectory: "C:\\path\\to\\workdir", // 工作目录（默认当前目录）
	}

	// 创建服务实例
	prg := &program{
		run: f,
	}
	s, err := service.New(prg, config)
	if err != nil {
		logs.Error(err)
		return
	}

	// 处理命令行参数（安装、卸载、启动、停止等）
	if len(os.Args) > 1 {
		switch os.Args[1] {
		case "install":
			// 安装服务（需要管理员权限）
			err := s.Install()
			if err != nil {
				logs.Errorf("安装服务失败: %v", err)
				return
			}
			cmd := exec.Command("sc", "failure", config.Name, "reset=86400", "actions=restart/2000/restart/3000/restart/5000")
			err = cmd.Run()
			if err != nil {
				logs.Errorf("设置服务失败: %v", err)
				return
			}
			logs.Info("服务安装成功！")
			return
		case "uninstall":
			// 卸载服务
			err := s.Uninstall()
			if err != nil {
				logs.Errorf("卸载服务失败: %v", err)
				return
			}
			logs.Info("服务卸载成功！")
			return
		case "start":
			// 启动服务
			err := s.Start()
			if err != nil {
				logs.Errorf("启动服务失败: %v", err)
				return
			}
			logs.Info("服务启动成功！")
			return
		case "stop":
			// 停止服务
			err := s.Stop()
			if err != nil {
				logs.Errorf("停止服务失败: %v", err)
				return
			}
			logs.Info("服务停止成功！")
			return
		default:
			logs.Warnf("未知命令: %s", os.Args[1])
			return
		}
	}

	// 运行服务（监听系统控制命令）
	err = s.Run()
	if err != nil {
		logs.Error(err)
	}
}
